# @Time    : 2022/8/24 10:25
# @Author  : 南黎
# @FileName: 生成素描草图.py
import cv2

img = cv2.imread("photo.png")#读取img图片

#1.转灰度图片
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#BGR格式图片转灰度图片

#2.反相
Antiphase_gray_image = 255 - gray_image#灰度图片进行反相

#3.高斯模糊
blurred_inverted_gray_image = cv2.GaussianBlur(Antiphase_gray_image, (21, 21), 0)#设置图片的高斯矩阵长和宽都是21，标差为0
# cv2.GaussianBlur 高斯模糊
# src –输入图像；图像可以具有任何数量的信道，其独立地处理的，但深度应CV_8U，CV_16U，CV_16S，CV_32F或CV_64F。
# dst –输出与图像大小和类型相同的图像src。
# ksize –高斯核大小。 ksize.width 并且 ksize.height 可以有所不同，但它们都必须是正数和奇数。或者，它们可以为零，然后从计算 sigma*。
# sigmaX – X方向上的高斯核标准偏差。
# sigmaY – Y方向上的高斯核标准差；如果 sigmaY 为零，则将其设置为等于 sigmaX；如果两个西格玛均为零，则分别根据ksize.width 和 进行计算 ksize.height（getGaussianKernel()有关详细信息，请参见 link)；完全控制的结果，无论这一切的语义未来可能的修改，建议指定所有的ksize，sigmaX和sigmaY。
# borderType –像素外推方法。
inverted_blurred_image = 255 - blurred_inverted_gray_image# 反转模糊图像处理

#4.图像除法
sketck = cv2.divide(gray_image, inverted_blurred_image, scale=256.0)# 得到素描图像
#  cv2.divide图像除法，用于得到图像灰度阴影图（素描草图的效果）
#  src1：作为被除数的图像数组
#  src2：作为乘除数的图像数组，大小和类型与src1相同
#  dst：可选参数，输出结果保存的变量，默认值为None，如果为非None，输出图像保存到dst对应实参中，其大小和通道数与输入图像相同，图像的深度（即图像像素的位数）由dtype参数或输入图像确定
#  scale：可选的结果图像缩放因子，即图像计算过程是src1*scale/src2
#  mask：图像掩膜，可选参数，为8位单通道的灰度图像，用于指定要更改的输出图像数组的元素，即输出图像像素只有mask对应位置元素不为0的部分才输出，否则该位置像素的所有通道分量都设置为0
#  dtype：可选参数，输出图像数组的深度，即图像单个像素值的位数（如RGB用三个字节表示，则为24位）。
#  返回值：相除的结果图像

#5.展示图片
cv2.imshow("Original Image", img)#展示原图片
cv2.imshow("Result Image", sketck)#展示处理后的图片
cv2.waitKey(0)#图片展示窗口定格，去掉会让展示窗口一闪而过

